package com.wanqing.assistant.store;

import com.wanqing.assistant.pojo.AdminChat;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.ChatMessageDeserializer;
import dev.langchain4j.data.message.ChatMessageSerializer;
import dev.langchain4j.store.memory.chat.ChatMemoryStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;

@Component
public class AdminChatMemoryStore implements ChatMemoryStore {
    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 获取指定聊天对象中的所有消息
     *
     * @param chat 聊天对象，类型为Object，实际应为AdminChat实例
     * @return 返回聊天消息列表，如果找不到对应记录则返回空列表
     * @throws IllegalArgumentException 当传入的chat参数为null时抛出
     */
    @Override
    public List<ChatMessage> getMessages(Object chat) {
        // 获取查询条件
        Query query = getQuery(chat);
        // 执行查询，获取AdminChat文档
        AdminChat adminChat = mongoTemplate.findOne(query, AdminChat.class);
        // 如果查询结果为null，返回空列表
        if (adminChat == null) return new LinkedList<>();
        // 将JSON格式的消息内容反序列化为ChatMessage列表并返回
        return ChatMessageDeserializer.messagesFromJson(adminChat.getContent());
    }

    @Override
    public void updateMessages(Object chat, List<ChatMessage> messages) {
        // 获取查询条件
        Query query = getQuery(chat);
        // 创建MongoDB更新对象，设置新的消息内容和添加时间
        //格式化时间
        Update update = new Update().set("content", ChatMessageSerializer.messagesToJson(messages))
                .set("createdAt", LocalDateTime.now());
        //根据query条件能查询出文档，则修改文档；否则新增文档
        mongoTemplate.upsert(query, update, AdminChat.class);
    }

    @Override
    public void deleteMessages(Object chat) {
        // 获取查询条件
        Query query = getQuery(chat);
        // 删除
        mongoTemplate.remove(query, AdminChat.class);
    }

    /**
     * 根据聊天对象获取MongoDB查询条件
     *
     * @param chat 聊天对象，需要转换为AdminChat类型使用
     * @return 返回构建好的MongoDB查询对象
     * @throws IllegalArgumentException 当传入的chat对象为null时会抛出异常
     */
    private Query getQuery(Object chat) {
        // 参数校验：检查传入的chat对象是否为null
        Objects.requireNonNull(chat, "Chat parameter cannot be null");
        // 将Object类型的chat强制转换为AdminChat类型
        AdminChat adminChat = (AdminChat) chat;
        // 构建MongoDB查询条件，匹配userId和chatMemoryId
        Criteria criteria = Criteria.where("adminId").is(adminChat.getAdminId())
                .and("chatMemoryId").is(adminChat.getChatMemoryId());
        // 创建MongoDB查询对象
        return new Query(criteria);
    }
}